预定义的着色器预处理器宏

当编译着色器程序,Unity定义了几个预处理器宏。

目标平台

    SHADER_API_D3D9 - Direct3D 9
    SHADER_API_D3D11 - desktop Direct3D 11
    SHADER_API_OPENGL - desktop OpenGL
    SHADER_API_GLES - OpenGL ES 2.0
    SHADER_API_GLES3 - OpenGL ES 3.0
    SHADER_API_METAL - iOS Metal
    SHADER_API_D3D11_9X - Direct3D 11 “feature level 9.x” target for Windows Store Apps & Windows Phone
    SHADER_API_PS4 - PlayStation 4
    SHADER_API_XBOXONE - Xbox One
    SHADER_API_PS3 - PlayStation 3
    SHADER_API_XBOX360 - Xbox 360
    SHADER_API_PSP2 - PlayStation Vita
    SHADER_API_PSM - PlayStation Mobile

通常SHADER_API_MOBILE被定义为所有“移动”平台(gl,GLES3、金属、PSP2)。

此外,SHADER_TARGET_GLSL定义当目标阴影语言是GLSL(总是对OpenGL / gl平台)。

着色器目标模型

SHADER_TARGET宏将被定义为一个数值匹配材质目标编译模型(即匹配# pragma目标指令)。例如,SHADER_TARGET将30当编译到着色模型3.0。你可以用它在着色器代码条件检查,例如:

if SHADER_TARGET < 30

// less than shader model 3.0:
// very limited shader capabilities, do some approximation

else

// decent capabilities, do a better thing

endif

Unity的版本

UNITY_VERSION macro will contain numeric value of Unity version, e.g. it will be 501 for Unity 5.0.1. This can be used for version comparisons if you need to write shaders that use different built-in shader functionality. For example, #if UNITY_VERSION >= 500 preprocessor check will only pass on versions 5.0.0 or later. UNITY_VERSION宏将包含数值的Unity版本,如Unity5.0.1将达到501。这可以用于版本比较如果你需要编写着色器使用不同的内置着色器的功能。例如,#if UNITY_VERSION > = 500预处理器检查只会转嫁5.0.0或更高版本。

平台差异助手

最好不要使用这些平台宏,因为它不是非常正确的。例如,如果你写一个着色器检查D3D9,那么也许在未来的检查应该扩展到包括D3D11。相反,Unity定义了几种辅助宏(HLSLSupport.cginc)帮助。

UNITY_BRANCH——添加这个条件语句提示编译器之前,这应该是编译成一个实际的分支。扩大到HLSL平台上时(分支)。
UNITY_FLATTEN——添加这个条件语句提示编译器之前,这应该被夷为平地,以避免实际的分支指令。扩大到HLSL平台上时(平)。
UNITY_NO_SCREENSPACE_SHADOWS平台上定义,不使用级联screenspace shadowmaps(移动平台)。
UNITY_NO_LINEAR_COLORSPACE——定义平台不支持线性颜色空间(移动平台)。
UNITY_NO_RGBM——平台上定义RGBM压缩以及材质为不使用(移动平台)。
UNITY_NO_DXT5nm平台上定义,不使用DXT5nm法线贴图压缩(移动平台)。
UNITY_FRAMEBUFFER_FETCH_AVAILABLE——平台上定义“framebuffer颜色取”功能可以提供(一般iOS平台- OpenGL ES 2.0,3.0和金属)。
UNITY_USE_RGBA_FOR_POINT_SHADOWS——平台上定义的点光源shadowmaps使用RGBA纹理编码深度(其他平台使用单通道浮点纹理)。
UNITY_ATTEN_CHANNEL——通道的光衰减结构包含数据;用于逐照明代码。定义为“r”或“a”。
UNITY_HALF_TEXEL_OFFSET——上定义的平台,需要一个half-texel抵消texel映射到像素的调整(例如Direct3D 9)。
UNITY_UV_STARTS_AT_TOP——总是定义与价值或1或0;价值之一是V在平台上的纹理坐标是零在纹理的“顶级”。Direct3D-like平台使用的值为1;OpenGL-like平台使用值为0。
UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE——如果一个平台定义可能效仿阴影地图或深度纹理通过手动呈现深度纹理。
UNITY_PROJ_COORD(a)- 4组件向量,返回一个纹理坐标适合投影纹理读取。在大多数平台上直接返回给定的值。
UNITY_NEAR_CLIP_VALUE——定义为剪切面附近的价值;Direct3D-like平台使用0.0而OpenGL-like平台使用-1.0。
UNITY_VPOS_TYPE——数据类型需要输入像素位置(VPOS)。float2 d3d 9,float4别处。
UNITY_CAN_COMPILE_TESSELLATION——定义当着色器编译器“理解”镶嵌材质HLSL语法(目前只有D3D11)。
UNITY_INITIALIZE_OUTPUT(类型、名称)——初始化变量名的特定类型为零。
UNITY_COMPILER_HLSL UNITY_COMPILER_HLSL2GLSL UNITY_COMPILER_CG——表明,材质使用编译器编译着色器。分别,微软的HLSL(用于DX9 DX11、XboxOne Xbox360,WinRT),HLSL GLSL翻译(用于OpenGL和iOS和Android),和英伟达的Cg(用于表面材质分析和一些索尼平台)。使用这个如果你遇到非常具体的角落着色器语法处理编译器之间的差异,为每个编译器和想写不同的代码。

阴影映射宏

声明和采样阴影图可以非常不同,这取决于平台,所以Unity有几个宏,以帮助:

UNITY_DECLARE_SHADOWMAP(tex) - 声明一个shadowmap纹理变量名称“tex”。
UNITY_SAMPLE_SHADOW(tex,uv) - shadowmap样本纹理“tex”给“uv”协调(XY组件结构位置、深度与Z分量)。返回单一的浮动值与阴影在0 . .1范围。
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) - 与上面类似,但是一个射影shadowmap阅读。“uv”是一个float4,除以所有其他组件。w进行查找。

常数缓冲宏

Direct3D 11组所有着色器变量为“恒缓冲区”。大部分Unity的内置变量已经分组,但对于变量在自己的着色器可能是更优的放在单独的常数缓冲区根据预期的更新频率。

使用CBUFFER_START(name)和CBUFFER_END宏:

CBUFFER_START(MyRarelyUpdatedVariables)
    float4 _SomeGlobalValue;
CBUFFER_END

宏纹理/取样器声明

通常你会使用Texture2D在着色器代码声明一个纹理采样器对。然而,在一些平台上(如DX11)纹理采样器是单独的对象;和最大采样数相当有限。统一有一些宏声明没有采样和样品的纹理;纹理使用另一个纹理采样器。使用这个,如果你最终运行到采样极限,你知道你的纹理实际上可以共享一个采样器(采样器定义纹理过滤和包装模式)。

UNITY_DECLARE_TEX2D(name) - 声明一个纹理+取样器。
UNITY_DECLARE_TEX2D_NOSAMPLER(name) - 声明没有取样器的纹理。
UNITY_SAMPLE_TEX2D(name,uv) - 样本纹理+取样器,使用给定的纹理坐标。
UNITY_SAMPLE_TEX2D_SAMPLER(name,samplername,uv) - 样本纹理(名字),使用采样器从另一个纹理(samplername)。

表面着色器Pass指标

When Surface Shaders are compiled, they end up generating a lot of code for various passes to do lighting. When compiling each pass, one of the following macros is defined: 当表面着色器编译,他们最终产生各种通过照明做很多代码。编译每个通道时,定义下列宏中的一个:

UNITY_PASS_FORWARDBASE - 前向渲染基础Pass(主要方向灯,以及材质,SH)。
UNITY_PASS_FORWARDADD - 前向渲染附加Pass(每Pass一盏灯)。
UNITY_PASS_DEFERRED - 延迟渲染Pass(渲染g-buffer)。
UNITY_PASS_SHADOWCASTER - 阴影绘制和深度纹理绘制。
UNITY_PASS_PREPASSBASE - 传统的递延照明基础Pass(渲染法线和镜面反射指数)。
UNITY_PASS_PREPASSFINAL - 传统的延迟照明最终Pass(适用照明和纹理)。